import scala.collection.mutable

object ScoreManagementSystem extends App {

  // 1. 定义学生数据结构（存储学生基本信息与各科成绩）
  case class Student(
                      id: String,
                      name: String,
                      className: String,
                      math: Int,
                      chinese: Int,
                      english: Int,
                      physics: Int,
                      chemistry: Int
                    )

  // 生成测试数据配置（4个班级，每个班级30名学生）
  val classNames = List("高一(1)班", "高一(2)班", "高一(3)班", "高一(4)班")
  val subjects = List("数学", "语文", "英语", "物理", "化学")

  // 随机生成学生数据（固定种子确保结果可复现，实际使用时可替换为真实数据）
  val random = new scala.util.Random(seed = 42) // 固定种子，避免每次运行结果不一致
  val students: Seq[Student] = for {
    className <- classNames
    id <- 1 to 30 // 每个班级生成30名学生（学号1-30）
  } yield Student(
    id = s"""${className.take(3)}${id.toString.padTo(2, '0')}""", // 学号格式：高X(X)班+两位序号（如“高一101”）
    name = s"学生${className.last}${id}", // 姓名格式：学生+班级序号+学生序号（如“学生11”代表1班1号）
    className = className,
    math = 50 + random.nextInt(50), // 数学成绩：50-99分（含边界）
    chinese = 50 + random.nextInt(50), // 语文成绩：50-99分
    english = 50 + random.nextInt(50), // 英语成绩：50-99分
    physics = 50 + random.nextInt(50), // 物理成绩：50-99分
    chemistry = 50 + random.nextInt(50) // 化学成绩：50-99分
  )

  // 2. 计算每个学生的总分和平均分（总分=5科成绩之和，平均分=总分/5）
  val studentsWithStats: Seq[(Student, Int, Double)] = for (student <- students) yield {
    val total = student.math + student.chinese + student.english +
      student.physics + student.chemistry // 计算总分（Int类型，避免精度丢失）
    val avg = total.toDouble / 5 // 平均分转为Double，保留小数精度
    (student, total, avg) // 返回元组：(学生对象, 总分, 平均分)
  }

  // 打印加载的学生总数
  println(s"已加载${students.size}名学生数据")

  // 3. 按班级统计平均分分数段（90+、80-89、70-79、60-69、60以下）
  val classScoreSegments: mutable.Map[String, Map[String, Int]] = mutable.Map()

  for (className <- classNames) {
    // 筛选当前班级的所有学生（从带统计信息的列表中过滤）
    val classStudents = studentsWithStats.filter(_._1.className == className)

    // 初始化各分数段计数器（默认值0）
    var aCount = 0  // 90分及以上
    var bCount = 0  // 80-89分
    var cCount = 0  // 70-79分
    var dCount = 0  // 60-69分
    var eCount = 0  // 60分以下

    // 遍历当前班级学生，统计各分数段人数
    for ((_, _, avg) <- classStudents) {
      avg match {
        case score if score >= 90 => aCount += 1
        case score if score >= 80 => bCount += 1
        case score if score >= 70 => cCount += 1
        case score if score >= 60 => dCount += 1
        case _ => eCount += 1
      }
    }

    // 将当前班级的分数段统计结果存入Map
    classScoreSegments(className) = Map(
      "90分以上" -> aCount,
      "80-89分" -> bCount,
      "70-79分" -> cCount,
      "60-69分" -> dCount,
      "60分以下" -> eCount
    )
  }

  // 4. 筛选优秀学生（条件：所有科目及格（≥60分）且平均分≥85分）
  val excellentStudents: Seq[(String, String, Double)] = for {
    (student, _, avg) <- studentsWithStats
    if student.math >= 60      // 数学及格
    if student.chinese >= 60   // 语文及格
    if student.english >= 60   // 英语及格
    if student.physics >= 60   // 物理及格
    if student.chemistry >= 60 // 化学及格
    if avg >= 85               // 平均分优秀
  } yield (student.name, student.className, avg) // 返回结果：(姓名, 班级, 平均分)

  // 打印优秀学生总数
  println(s"优秀学生总数：${excellentStudents.size}人")

  // 5. 计算每个班级的各科平均分（按班级分组，计算每科的平均分）
  val classSubjectAverages: Seq[(String, Map[String, Double])] = for (className <- classNames) yield {
    // 筛选当前班级的学生（从原始学生列表中过滤）
    val classStudents = students.filter(_.className == className)
    // 计算各科平均分（sum求和后转Double，除以班级人数）
    val mathAvg = classStudents.map(_.math).sum.toDouble / classStudents.size
    val chineseAvg = classStudents.map(_.chinese).sum.toDouble / classStudents.size
    val englishAvg = classStudents.map(_.english).sum.toDouble / classStudents.size
    val physicsAvg = classStudents.map(_.physics).sum.toDouble / classStudents.size
    val chemistryAvg = classStudents.map(_.chemistry).sum.toDouble / classStudents.size

    // 返回结果：(班级名称, 各科平均分Map)
    (className, Map(
      "数学" -> mathAvg,
      "语文" -> chineseAvg,
      "英语" -> englishAvg,
      "物理" -> physicsAvg,
      "化学" -> chemistryAvg
    ))
  }

  // 6. 输出核心统计结果（按业务需求展示关键信息）
  // 6.1 输出第一个班级的分数段统计
  val firstClass = classNames.head
  println(s"\n===== $firstClass 分数段统计 =====")
  classScoreSegments(firstClass).foreach { case (segment, count) =>
    println(s"$segment：$count 人")
  }

  // 6.2 输出前5名优秀学生（若不足5人则全部输出）
  println("\n===== 优秀学生（前5名） =====")
  excellentStudents.take(5).foreach { case (name, cls, avg) =>
    println(f"$name（$cls）：平均分${avg}%.1f") // 平均分保留1位小数
  }

  // 6.3 输出各班数学平均分排名（按数学平均分降序排列）
  println("\n===== 各班数学平均分排名 =====")
  classSubjectAverages.sortBy(-_._2("数学")).foreach { case (cls, avgs) =>
    println(f"$cls：${avgs("数学")}%.1f") // 数学平均分保留1位小数
  }

  // 6.4 输出年级总分前10名（按总分降序排列，取前10）
  println("\n===== 年级总分前10名 =====")
  studentsWithStats.sortBy(-_._2).take(10).foreach { case (s, total, avg) =>
    println(f"${s.name}（${s.className}）：总分$total，平均分$avg%.1f") // 平均分保留1位小数
  }
}